Libraries:
library(tidyverse)
Registered S3 method overwritten by 'dplyr':
method from
print.rowwise_df
[30m-- [1mAttaching packages[22m --------------------------------------- tidyverse 1.2.1 --[39m
[30m[32mv[30m [34mggplot2[30m 3.2.1 [32mv[30m [34mpurrr [30m 0.3.3
[32mv[30m [34mtibble [30m 2.1.3 [32mv[30m [34mdplyr [30m 0.8.3
[32mv[30m [34mtidyr [30m 1.0.0 [32mv[30m [34mstringr[30m 1.4.0
[32mv[30m [34mreadr [30m 1.3.1 [32mv[30m [34mforcats[30m 0.4.0[39m
[30m-- [1mConflicts[22m ------------------------------------------ tidyverse_conflicts() --
[31mx[30m [34mdplyr[30m::[32mfilter()[30m masks [34mstats[30m::filter()
[31mx[30m [34mdplyr[30m::[32mlag()[30m masks [34mstats[30m::lag()[39m
library(readr)
library(rvest)
Loading required package: xml2
Attaching package: 㤼㸱rvest㤼㸲
The following object is masked from 㤼㸱package:purrr㤼㸲:
pluck
The following object is masked from 㤼㸱package:readr㤼㸲:
guess_encoding
library(stats)
library(readxl)
library(dplyr)
library(stringr)
library(ggplot2)
library(ggthemes)
package 㤼㸱ggthemes㤼㸲 was built under R version 3.6.2
library(stringr)
library(data.table)
Registered S3 method overwritten by 'data.table':
method from
print.data.table
data.table 1.12.6 using 4 threads (see ?getDTthreads). Latest news: r-datatable.com
Attaching package: 㤼㸱data.table㤼㸲
The following objects are masked from 㤼㸱package:dplyr㤼㸲:
between, first, last
The following object is masked from 㤼㸱package:purrr㤼㸲:
transpose
library(geojsonio)
Attaching package: 㤼㸱geojsonio㤼㸲
The following object is masked from 㤼㸱package:base㤼㸲:
pretty
library(leaflet)
Registered S3 methods overwritten by 'htmltools':
method from
print.html tools:rstudio
print.shiny.tag tools:rstudio
print.shiny.tag.list tools:rstudio
Registered S3 method overwritten by 'htmlwidgets':
method from
print.htmlwidget tools:rstudio
library(rgdal)
Loading required package: sp
rgdal: version: 1.4-7, (SVN revision 845)
Geospatial Data Abstraction Library extensions to R successfully loaded
Loaded GDAL runtime: GDAL 2.2.3, released 2017/11/20
Path to GDAL shared files: C:/Users/neris/OneDrive/Documents/R/win-library/3.6/rgdal/gdal
GDAL binary built with GEOS: TRUE
Loaded PROJ.4 runtime: Rel. 4.9.3, 15 August 2016, [PJ_VERSION: 493]
Path to PROJ.4 shared files: C:/Users/neris/OneDrive/Documents/R/win-library/3.6/rgdal/proj
Linking to sp version: 1.3-1
library(haven)
library(stargazer)
Please cite as:
Hlavac, Marek (2018). stargazer: Well-Formatted Regression and Summary Statistics Tables.
R package version 5.2.2. https://CRAN.R-project.org/package=stargazer
Data:
Model 3:
First making a graph of annual GDP highs and lows – maybe a temporary proxy for recessions?
Annual enrollment graph:
Join enrollment data and gdp data to create linear model test:
Graph it?
College Proximity Question 5/3: (Reading in Ivy’s data)
cz <- read_dta('cz.dta')
Error in read_dta("cz.dta") : could not find function "read_dta"
Read in/create mobility data: (Trends in Mobility: Commuting Zone Intergenerational Mobility Estimates by Birth Cohort) https://opportunityinsights.org/data/?geographic_level=101&topic=0&paper_id=0#resource-listing
Read in geojson file:
Commuting zones on the map (cz.geojson@data) are in 1990s format. They need to be converted so our post-2000 data can be connected to the shapefiles: (https://www.ers.usda.gov/data-products/commuting-zones-and-labor-market-areas/)
Making the map actually display data:
cz.geo %>%
leaflet() %>%
addTiles() %>%
addPolygons(fillColor = ~colors1(cz.geo@data$ncollege),
weight = 1,
color = "white",
opacity = 0.5,
fillOpacity = .7) %>%
setView(-96, 37.8, 3) %>%
addLegend(pal = colors1,
values = cz.geo@data$ncollege,
title = "Number of Colleges in Commuting Zone")
Some values were outside the color scale and will be treated as NA
Try to run some lms:
Ivy’s STATA code:
foreach x of varlist ncollege nfouryr nfouryrpriv npub nelite hascollege{
foreach y of varlist kfr_pooled_pooled_p1 kfr_pooled_pooled_p25 kfr_pooled_pooled_p50 kfr_pooled_pooled_p75 kfr_pooled_pooled_p100 {
reg `y' `x' popdensity2010 med_hhinc2016, r
outreg2 using `x'_kfr, excel append ctitle(`y')
}
Variables of interest:
as.formula(paste0(yvar1, " ~ ", paste0(xvars1, collapse = " + ")))
kfr_pooled_pooled_p1 ~ ncollege + nfouryr + nfouryrpriv + npub +
nelite + hascollege + popdensity2010 + med_hhinc2016
testing?
stargazer(lm.kfr_p1,
type = "text",
dep.var.labels = c("kfr_pooled_pooled_p1"))
length of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changed
===============================================
Dependent variable:
---------------------------
kfr
-----------------------------------------------
ncollege 0.003
(0.004)
nfouryr 0.007*
(0.004)
nfouryrpriv -0.012***
(0.004)
npub -0.011***
(0.004)
nelite 0.006
(0.005)
hascollege -0.049***
(0.006)
popdensity2010 -0.0001***
(0.00001)
med_hhinc2016 0.00000***
(0.00000)
Constant 0.251***
(0.012)
-----------------------------------------------
Observations 741
R2 0.281
Adjusted R2 0.273
Residual Std. Error 0.062 (df = 732)
F Statistic 35.756*** (df = 8; 732)
===============================================
Note: *p<0.1; **p<0.05; ***p<0.01
nelite on kfr at different levels
htmtable.nelite <- stargazer(nelite.p1, nelite.p25, nelite.p50, nelite.p75, nelite.p100,
type = "html",
dep.var.labels = c("Bottom 1%", "25%", "50%", "75%", "Top 1%"),
out = "nelitetable.html")
length of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changed
<table style="text-align:center"><tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left"></td><td colspan="5"><em>Dependent variable:</em></td></tr>
<tr><td></td><td colspan="5" style="border-bottom: 1px solid black"></td></tr>
<tr><td style="text-align:left"></td><td>Bottom 1%</td><td>25%</td><td>50%</td><td>75%</td><td>Top 1%</td></tr>
<tr><td style="text-align:left"></td><td>(1)</td><td>(2)</td><td>(3)</td><td>(4)</td><td>(5)</td></tr>
<tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">nelite</td><td>-0.004</td><td>-0.002</td><td>-0.001</td><td>0.001</td><td>0.004</td></tr>
<tr><td style="text-align:left"></td><td>(0.003)</td><td>(0.003)</td><td>(0.002)</td><td>(0.002)</td><td>(0.003)</td></tr>
<tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td style="text-align:left">popdensity2010</td><td>-0.0001<sup>***</sup></td><td>-0.0001<sup>***</sup></td><td>-0.00004<sup>***</sup></td><td>-0.00002<sup>***</sup></td><td>-0.00000</td></tr>
<tr><td style="text-align:left"></td><td>(0.00001)</td><td>(0.00001)</td><td>(0.00001)</td><td>(0.00001)</td><td>(0.00001)</td></tr>
<tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td style="text-align:left">med_hhinc2016</td><td>0.00000<sup>***</sup></td><td>0.00000<sup>***</sup></td><td>0.00000<sup>***</sup></td><td>0.00000</td><td>-0.00000<sup>***</sup></td></tr>
<tr><td style="text-align:left"></td><td>(0.00000)</td><td>(0.00000)</td><td>(0.00000)</td><td>(0.00000)</td><td>(0.00000)</td></tr>
<tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td style="text-align:left">Constant</td><td>0.221<sup>***</sup></td><td>0.350<sup>***</sup></td><td>0.471<sup>***</sup></td><td>0.585<sup>***</sup></td><td>0.770<sup>***</sup></td></tr>
<tr><td style="text-align:left"></td><td>(0.012)</td><td>(0.010)</td><td>(0.009)</td><td>(0.009)</td><td>(0.009)</td></tr>
<tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">Observations</td><td>741</td><td>741</td><td>741</td><td>741</td><td>741</td></tr>
<tr><td style="text-align:left">R<sup>2</sup></td><td>0.141</td><td>0.104</td><td>0.055</td><td>0.016</td><td>0.030</td></tr>
<tr><td style="text-align:left">Adjusted R<sup>2</sup></td><td>0.137</td><td>0.100</td><td>0.051</td><td>0.012</td><td>0.026</td></tr>
<tr><td style="text-align:left">Residual Std. Error (df = 737)</td><td>0.068</td><td>0.057</td><td>0.050</td><td>0.047</td><td>0.053</td></tr>
<tr><td style="text-align:left">F Statistic (df = 3; 737)</td><td>40.261<sup>***</sup></td><td>28.387<sup>***</sup></td><td>14.380<sup>***</sup></td><td>4.096<sup>***</sup></td><td>7.651<sup>***</sup></td></tr>
<tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left"><em>Note:</em></td><td colspan="5" style="text-align:right"><sup>*</sup>p<0.1; <sup>**</sup>p<0.05; <sup>***</sup>p<0.01</td></tr>
</table>
image print cheeeeck:
tables %>%
ggplot() +
geom_bar(stat = "identity") +
geom_image(aes(image = picture),
size = .2)
Error: geom_bar requires the following missing aesthetics: x, y

Plotting the lms:

Wait lemme try the long format thing:
write_csv(data_long1a, "long_kfr.csv")
Error in is.data.frame(x) : object 'data_long1a' not found
Output table:
stargazer(long.lm1,
type = "text")
length of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changed
===============================================
Dependent variable:
---------------------------
kfr
-----------------------------------------------
ncollege -0.001***
(0.0003)
black -0.099***
(0.004)
white 0.023***
(0.003)
popdensity2010 -0.00001**
(0.00001)
med_hhinc2016 0.00000***
(0.00000)
Constant 0.478***
(0.007)
-----------------------------------------------
Observations 10,250
R2 0.119
Adjusted R2 0.119
Residual Std. Error 0.142 (df = 10244)
F Statistic 276.960*** (df = 5; 10244)
===============================================
Note: *p<0.1; **p<0.05; ***p<0.01
Try with interaction & w/o hhinc:
summary(long.lm1a)
Call:
lm(formula = kfr ~ ncollege + black + white + black * ncollege +
white * ncollege + popdensity2010 + med_hhinc2016, data = long.data1a)
Residuals:
Min 1Q Median 3Q Max
-0.39850 -0.10502 -0.01114 0.09142 0.85434
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.787e-01 7.168e-03 66.775 < 2e-16 ***
ncollege -1.284e-03 4.290e-04 -2.993 0.00277 **
blackTRUE -1.006e-01 3.960e-03 -25.394 < 2e-16 ***
whiteTRUE 2.189e-02 3.629e-03 6.031 1.69e-09 ***
popdensity2010 -1.494e-05 7.062e-06 -2.116 0.03440 *
med_hhinc2016 9.841e-07 1.429e-07 6.888 5.99e-12 ***
ncollege:blackTRUE 4.269e-04 5.166e-04 0.826 0.40862
ncollege:whiteTRUE 4.141e-04 5.091e-04 0.814 0.41594
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.142 on 10242 degrees of freedom
(865 observations deleted due to missingness)
Multiple R-squared: 0.1192, Adjusted R-squared: 0.1186
F-statistic: 197.9 on 7 and 10242 DF, p-value: < 2.2e-16
No significant difference. Will stick to original model.
Visualize it maybe?:

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.
When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).
The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.
LS0tDQp0aXRsZTogImVjb240MDEgZmluYWwgcHJvamVjdCBSIE5vdGVib29rIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KTGlicmFyaWVzOg0KYGBge3IgbGlicmFyaWVzLCByZXN1bHRzID0gIm1hcmt1cCJ9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHJ2ZXN0KQ0KbGlicmFyeShzdGF0cykNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ2d0aGVtZXMpDQpsaWJyYXJ5KHN0cmluZ3IpDQpsaWJyYXJ5KGRhdGEudGFibGUpDQpsaWJyYXJ5KGdlb2pzb25pbykNCmxpYnJhcnkobGVhZmxldCkNCmxpYnJhcnkocmdkYWwpDQpsaWJyYXJ5KGhhdmVuKQ0KbGlicmFyeShzdGFyZ2F6ZXIpDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCmBgYA0KDQpEYXRhOg0KYGBge3IgZGF0YSwgaW5jbHVkZSA9IEZBTFNFfQ0KIyBHRFAgdXAgdG8gRmViIDIwMjANCiMgaHR0cHM6Ly9paHNtYXJraXQuY29tL3Byb2R1Y3RzL3VzLW1vbnRobHktZ2RwLWluZGV4Lmh0bWwNCmdkcC5pbmRleC5kYXRhIDwtIHJlYWR4bDo6cmVhZF94bHN4KCdVUy1Nb250aGx5LUdEUC1IaXN0b3J5LURhdGEueGxzeCcsIHNoZWV0ID0gMykNCmdkcC5pbmRleCA8LSBnZHAuaW5kZXguZGF0YQ0KY29sbmFtZXMoZ2RwLmluZGV4KVsxXSA8LSAiWV9NIg0KeWVhci5tb250aCA8LSBzdHJfc3BsaXRfZml4ZWQoZ2RwLmluZGV4JFlfTSwgJyAtICcsIDIpDQpjb2xuYW1lcyh5ZWFyLm1vbnRoKSA8LSBjKCdZZWFyJywgJ01vbnRoJykNCmdkcC5pbmRleCA8LSBjYmluZCh5ZWFyLm1vbnRoLCBnZHAuaW5kZXhbLCAtMV0pDQpnZHAuYW5udWFsIDwtIGdkcC5pbmRleCAlPiUNCiAgZ3JvdXBfYnkoWWVhcikgJT4lDQogIHN1bW1hcml6ZShNYXhHRFAgPSBtYXgoYE1vbnRobHkgUmVhbCBHRFAgSW5kZXhgKSwNCiAgICAgICAgICAgIE1pbkdEUCA9IG1pbihgTW9udGhseSBSZWFsIEdEUCBJbmRleGApKQ0KDQojIGh0dHBzOi8vbmNlcy5lZC5nb3YvcHJvZ3JhbXMvZGlnZXN0L2QxOC90YWJsZXMvZHQxOF8zMDYuMTAuYXNwDQplbnJvbGxtZW50LmRhdGEgPC0gcmVhZF94bHMoJ3RhYm4zMDYuMTAueGxzJykNCmVucm9sbG1lbnQgPC0gZW5yb2xsbWVudC5kYXRhWzE6MTJdDQojIGVucm9sbG1lbnQgaXMgaW4gdGhvdXNhbmRzDQplbnJvbGxtZW50IDwtIGVucm9sbG1lbnRbLWMoMSwgMywgMTUsIDI3LCAzOSwgNTEsIDYzLCA3NSwgOTksIDExMSwgMTIzLCAxMzU6MTM5KSwgXQ0KY29sMSA8LSBkYXRhLmZyYW1lKHN0cl9yZW1vdmVfYWxsKGVucm9sbG1lbnRbWzFdXSwgJ1xcLicpLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpDQpjb2wxWzIsIDFdIDwtICJBbGxfU3R1ZGVudHMiDQplbnJvbGxtZW50IDwtIGNiaW5kKGNvbDEsIGVucm9sbG1lbnRbLCAtMV0pDQplbnJvbGxtZW50IDwtIHQoZW5yb2xsbWVudCkNCnJvd25hbWVzKGVucm9sbG1lbnQpIDwtIGMoKQ0KY29sbmFtZXMoZW5yb2xsbWVudCkgPC0gZW5yb2xsbWVudFsxLCBdDQplbnJvbGxtZW50IDwtIGRhdGEuZnJhbWUoZW5yb2xsbWVudCkNCmNvbG5hbWVzKGVucm9sbG1lbnQpWzFdIDwtICdZZWFyJw0KZW5yb2xsbWVudCA8LSBlbnJvbGxtZW50Wy0xLCBdDQpZZWFycyA8LSBhcy5udW1lcmljKHN0cl9leHRyYWN0KGVucm9sbG1lbnQkWWVhciwgIls6ZGlnaXQ6XXs0fSIpKQ0KZW5yb2xsbWVudCA8LSBjYmluZChZZWFycywgZW5yb2xsbWVudFssIC0xXSkNCmVucm9sbG1lbnQgPC0gZGF0YS5mcmFtZShsYXBwbHkoZW5yb2xsbWVudCwgZnVuY3Rpb24oeCl7IA0KICBnc3ViKCItLS0iLCBOQSwgeCkNCn0pKQ0Kc3RyKGVucm9sbG1lbnQpDQoNCmVucm9sbG1lbnQxIDwtIGVucm9sbG1lbnRbLCAxOjJdDQpnZHAuYW5udWFsMSA8LSBnZHAuYW5udWFsDQphbGwuc3R1ZGVudHMgPC0gYXMubnVtZXJpYyhlbnJvbGxtZW50WzQ6MTEsIDJdKQ0KDQpnZHAuYW5udWFsJFllYXIgPC0gYXMuZmFjdG9yKGdkcC5hbm51YWwkWWVhcikNCmVucm9sbG1lbnQxJFllYXJzIDwtIGFzLmZhY3RvcihlbnJvbGxtZW50MSRZZWFycykNCmVucm9sbG1lbnQxJEFsbF9TdHVkZW50cyA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihlbnJvbGxtZW50MSRBbGxfU3R1ZGVudHMpKQ0KYGBgDQoNCk1vZGVsIDM6DQoNCiAgRmlyc3QgbWFraW5nIGEgZ3JhcGggb2YgYW5udWFsIEdEUCBoaWdocyBhbmQgbG93cyAtLSBtYXliZSBhIHRlbXBvcmFyeSBwcm94eSBmb3IgcmVjZXNzaW9ucz8NCmBgYHtyIGdyYXBoMSwgaW5jbHVkZSA9IEZBTFNFfQ0KZ2RwLmFubnVhbCAlPiUNCiAgZ2dwbG90KCkgKw0KICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gWWVhciwNCiAgICAgICAgICAgICAgICAgeSA9IE1heEdEUCwNCiAgICAgICAgICAgICAgICAgZ3JvdXAgPSAxKSkgKw0KICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gWWVhciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IE1pbkdEUCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSAxKSkgKw0KICB0aGVtZV9lY29ub21pc3QoKSArDQogIHlsYWIoJ1JlYWwgR0RQJykNCmBgYA0KDQogIEFubnVhbCBlbnJvbGxtZW50IGdyYXBoOg0KYGBge3IgZ3JhcGgyLCBpbmNsdWRlID0gRkFMU0V9DQplbnJvbGxtZW50MSAlPiUNCiAgZ2dwbG90KCkgKw0KICBnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gWWVhcnMsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBBbGxfU3R1ZGVudHMsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gMSkpICsNCiAgdGhlbWVfZWNvbm9taXN0KCkgKw0KICB5bGFiKCdFbnJvbGxtZW50JykNCmBgYA0KDQogIEpvaW4gZW5yb2xsbWVudCBkYXRhIGFuZCBnZHAgZGF0YSB0byBjcmVhdGUgbGluZWFyIG1vZGVsIHRlc3Q6DQpgYGB7ciBsbTEsIGluY2x1ZGUgPSBGQUxTRX0NCnRlc3QgPC0gaW5uZXJfam9pbihlbnJvbGxtZW50MSwgZ2RwLmFubnVhbDEsDQogICAgICAgICAgYnkgPSBjKCJZZWFycyIgPSAiWWVhciIpKQ0KDQpsbTEgPC0gbG0oQWxsX1N0dWRlbnRzIH4gTWF4R0RQLA0KICAgICAgICAgIGRhdGEgPSB0ZXN0LA0KICAgICAgICAgIG5hLmFjdGlvbiA9IG5hLm9taXQpDQpzdW1tYXJ5KGxtMSkNCmBgYA0KDQogIEdyYXBoIGl0Pw0KYGBge3IgZ3JhcGgzXzQsIGluY2x1ZGUgPSBGQUxTRX0NCnRlc3QgJT4lDQogIGdncGxvdCgpICsNCiAgZ2VvbV9saW5lKGFlcyh4ID0gWWVhcnMsDQogICAgICAgICAgICAgICAgIHkgPSBBbGxfU3R1ZGVudHMsDQogICAgICAgICAgICAgICAgZ3JvdXAgPSAxKSkgKw0KICB0aGVtZV9lY29ub21pc3QoKSArDQogIHlsYWIoJ0Vucm9sbG1lbnQgYnkgQWxsIFN0dWRlbnRzJykNCg0KdGVzdCAlPiUNCiAgZ2dwbG90KCkgKw0KICBnZW9tX2xpbmUoYWVzKHggPSBZZWFycywNCiAgICAgICAgICAgICAgICAgeSA9IE1heEdEUCwNCiAgICAgICAgICAgICAgICAgZ3JvdXAgPSAxKSkgKw0KICAjIGdlb21fYWJsaW5lKHNsb3BlID0gMC44MDE1LCBpbnRlcmNlcHQgPSA2MzE2LjcyMDcpICsNCiAgdGhlbWVfZWNvbm9taXN0KCkNCmBgYA0KDQpDb2xsZWdlIFByb3hpbWl0eSBRdWVzdGlvbiA1LzM6DQooUmVhZGluZyBpbiBJdnkncyBkYXRhKQ0KYGBge3IgcmVhZCBwcm94aW1pdHkgZGF0YSwgcmVzdWx0cyA9ICJtYXJrdXAifQ0KIyBjel9jb2xsZWdlIDwtIHJlYWRfZHRhKCJjel9jb2xsZWdlLmR0YSIpDQpjeiA8LSByZWFkX2R0YSgnY3ouZHRhJykNCiMgY29sbGVnZXMgPC0gcmVhZF9kdGEoJ2NvbGxlZ2VzLmR0YScpDQojIG1vYmlsaXR5LnJlc3VsdHMgPC0gcmVhZF94bHN4KCdtb2JpbGl0eV9yZXN1bHRzLnhsc3gnKQ0KYGBgDQoNClJlYWQgaW4vY3JlYXRlIG1vYmlsaXR5IGRhdGE6DQooVHJlbmRzIGluIE1vYmlsaXR5OiBDb21tdXRpbmcgWm9uZSBJbnRlcmdlbmVyYXRpb25hbCBNb2JpbGl0eSBFc3RpbWF0ZXMgYnkgQmlydGggQ29ob3J0KQ0KaHR0cHM6Ly9vcHBvcnR1bml0eWluc2lnaHRzLm9yZy9kYXRhLz9nZW9ncmFwaGljX2xldmVsPTEwMSZ0b3BpYz0wJnBhcGVyX2lkPTAjcmVzb3VyY2UtbGlzdGluZw0KYGBge3IgbW9iaWxpdHkgZGF0YSwgaW5jbHVkZT1GQUxTRX0NCiMgbW9iaWxpdHkuZGF0YSA8LSByZWFkX3hscygnb25saW5lZGF0YTFfdHJlbmRzLnhscycpDQojIGNvbG5hbWVzKG1vYmlsaXR5LmRhdGEpIDwtIG1vYmlsaXR5LmRhdGFbMTUsIF0NCiMgbW9iaWxpdHkgPC0gbW9iaWxpdHkuZGF0YVstYygxOjE2KSwgXQ0KIyBtb2JpbGl0eS4xOTg2IDwtIG1vYmlsaXR5ICU+JQ0KIyAgIGZpbHRlcihgQmlydGggQ29ob3J0YCA9PSAxOTg2KQ0KIyBtb2JpbGl0eS4xOTg2JGBDb21tdXRpbmcgWm9uZWAgPC0gYXMubnVtZXJpYyhtb2JpbGl0eS4xOTg2JGBDb21tdXRpbmcgWm9uZWApDQojIGN6Lm1vYmlsaXR5LmRhdGEgPC0gZnVsbF9qb2luKG1vYmlsaXR5LjE5ODZbLCBjKDEsIDM6OCldLA0KIyAgICAgICAgICAgICAgICAgICBjeiwNCiMgICAgICAgICAgICAgICAgICAgYnkgPSBjKGBDb21tdXRpbmcgWm9uZWAgPSAnY3onKSkNCiMgDQojIGN6Lm1vYmlsaXR5IDwtIGN6Lm1vYmlsaXR5LmRhdGFbLCBjKDE6OCwgMjEzMjoyMTM3KV0NCiMgY3oubW9iaWxpdHkgPC0gY3oubW9iaWxpdHlbLCBjKDEsIDgsIDk6MTQsIDM6NywgMildDQojIHdyaXRlX2Nzdihjei5tb2JpbGl0eSwgJ2N6Lm1vYmlsaXR5LmNzdicpDQpjei5tb2JpbGl0eSA8LSByZWFkX2NzdignY3oubW9iaWxpdHkuY3N2JykNCmBgYA0KDQpSZWFkIGluIGdlb2pzb24gZmlsZToNCmBgYHtyIGdlb2pzb259DQpjei5nZW9qc29uIDwtIGdlb2pzb25fcmVhZCgiY3oxOTkwLmpzb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgd2hhdCA9ICJzcCIpDQojIFZpZXcoY3ouZ2VvanNvbkBkYXRhKQ0KIyBjei5nZW9qc29uICU+JQ0KIyAgIGxlYWZsZXQoKSAlPiUNCiMgICAjYWRkVGlsZXMoKSAlPiUNCiMgICBhZGRQb2x5Z29ucygpICU+JQ0KIyAgIHNldFZpZXcoLTk2LCAzNy44LCAzKQ0KYGBgDQoNCkNvbW11dGluZyB6b25lcyBvbiB0aGUgbWFwIChjei5nZW9qc29uQGRhdGEpIGFyZSBpbiAxOTkwcyBmb3JtYXQuIFRoZXkgbmVlZCB0byBiZSBjb252ZXJ0ZWQgc28gb3VyIHBvc3QtMjAwMCBkYXRhIGNhbiBiZSBjb25uZWN0ZWQgdG8gdGhlIHNoYXBlZmlsZXM6DQooaHR0cHM6Ly93d3cuZXJzLnVzZGEuZ292L2RhdGEtcHJvZHVjdHMvY29tbXV0aW5nLXpvbmVzLWFuZC1sYWJvci1tYXJrZXQtYXJlYXMvKQ0KYGBge3IgY3ogc2hhcGUgY29tYmluZSwgaW5jbHVkZSA9IEZBTFNFfQ0KIyBjei5jb252ZXJzaW9ucyA8LSByZWFkX3hscygnY3owMF9lcXZfdjEueGxzJykNCiMgY3ouY29udmVyc2lvbnMgPC0gY3ouY29udmVyc2lvbnNbLCBjKDI6NCldDQojIGN6LmNvbnZlcnNpb25zJGBDb21tdXRpbmcgWm9uZSBJRCwgMTk5MGAgPC0gYXMubnVtZXJpYyhjei5jb252ZXJzaW9ucyRgQ29tbXV0aW5nIFpvbmUgSUQsIDE5OTBgKQ0KIyBjei5jb252ZXJzaW9ucyRgQ29tbXV0aW5nIFpvbmUgSUQsIDE5ODBgIDwtIGFzLm51bWVyaWMoY3ouY29udmVyc2lvbnMkYENvbW11dGluZyBab25lIElELCAxOTgwYCkNCiMgY29sbmFtZXMoY3ouY29udmVyc2lvbnMpWzJdIDwtICdjejE5OTAnDQojIGNvbG5hbWVzKGN6LmNvbnZlcnNpb25zKVsxXSA8LSAnY3oyMDAwJw0KIyBjb2xuYW1lcyhjei5jb252ZXJzaW9ucylbM10gPC0gJ2N6MTk4MCcNCiMgDQojIGhlYWQoY3ouZ2VvanNvbkBkYXRhKQ0KIyBjei5nZW8gPC0gY3ouZ2VvanNvbg0KIyBjb2xuYW1lcyhjei5tb2JpbGl0eSlbMV0gPC0gJ2N6MTk5MCcNCiMgDQojIGN6Lmdlb0BkYXRhIDwtIGZ1bGxfam9pbihjei5nZW9AZGF0YSwNCiMgICAgICAgICAgICAgICAgICAgY3ouY29udmVyc2lvbnNbLCAtM10sDQojICAgICAgICAgICAgICAgICAgIGJ5ID0gYygnY3onID0gJ2N6MTk5MCcpKQ0KIyBjei5nZW9AZGF0YSA8LSBsZWZ0X2pvaW4oY3ouZ2VvQGRhdGEsDQojICAgICAgICAgICAgICAgICAgICAgICAgICBjei5tb2JpbGl0eSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygnY3onID0gJ2N6MTk5MCcpKQ0KIyANCiMgY3ouZ2VvICU+JQ0KIyAgIGxlYWZsZXQoKSAlPiUNCiMgICBhZGRQb2x5Z29ucygpICU+JQ0KIyAgIHNldFZpZXcoLTk2LCAzNy44LCAzKQ0KDQojIGdlb2pzb25fd3JpdGUoY3ouZ2VvLA0KIyAgICAgICAgICAgICAgIGZpbGUgPSAiY3pfZ2VvLmdlb2pzb24iLA0KIyAgICAgICAgICAgICAgIG92ZXJ3cml0ZSA9IFRSVUUpDQoNCmN6LmdlbyA8LSBnZW9qc29uX3JlYWQoImN6X2dlby5nZW9qc29uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHdoYXQgPSAic3AiKQ0KYGBgDQoNCk1ha2luZyB0aGUgbWFwIGFjdHVhbGx5IGRpc3BsYXkgZGF0YToNCmBgYHtyfQ0KYmluczEgPC0gYygxLCA1LCAxMCwgMjAsIDQwLCA2MCwgOTApDQogICAgICAgIA0KY29sb3JzMSA8LSBjb2xvckJpbihiaW5zID0gYmluczEsDQogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAiWWxPclJkIiwNCiAgICAgICAgICAgICAgICAgICAgZG9tYWluID0gY3ouZ2VvQGRhdGEkbmNvbGxlZ2UpDQogICAgICAgIA0KY3ouZ2VvICU+JQ0KICBsZWFmbGV0KCkgJT4lDQogIGFkZFRpbGVzKCkgJT4lDQogIGFkZFBvbHlnb25zKGZpbGxDb2xvciA9IH5jb2xvcnMxKGN6Lmdlb0BkYXRhJG5jb2xsZWdlKSwNCiAgICAgICAgICAgICAgd2VpZ2h0ID0gMSwNCiAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLA0KICAgICAgICAgICAgICBvcGFjaXR5ID0gMC41LA0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IC43KSAlPiUNCiAgc2V0VmlldygtOTYsIDM3LjgsIDMpICU+JQ0KICBhZGRMZWdlbmQocGFsID0gY29sb3JzMSwNCiAgICAgICAgICAgIHZhbHVlcyA9IGN6Lmdlb0BkYXRhJG5jb2xsZWdlLA0KICAgICAgICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIENvbGxlZ2VzIGluIENvbW11dGluZyBab25lIikNCg0KDQpgYGANCg0KDQpUcnkgdG8gcnVuIHNvbWUgbG1zOg0KDQogIEl2eSdzIFNUQVRBIGNvZGU6DQoNCiAgICBmb3JlYWNoIHggb2YgdmFybGlzdCBuY29sbGVnZSBuZm91cnlyIG5mb3VyeXJwcml2IG5wdWIgbmVsaXRlIGhhc2NvbGxlZ2V7DQogICAgCQ0KICAgIGZvcmVhY2ggeSBvZiB2YXJsaXN0IGtmcl9wb29sZWRfcG9vbGVkX3AxIGtmcl9wb29sZWRfcG9vbGVkX3AyNSBrZnJfcG9vbGVkX3Bvb2xlZF9wNTAga2ZyX3Bvb2xlZF9wb29sZWRfcDc1IGtmcl9wb29sZWRfcG9vbGVkX3AxMDAgew0KICAgIAlyZWcgYHknIGB4JyBwb3BkZW5zaXR5MjAxMCBtZWRfaGhpbmMyMDE2LCByIA0KICAgIAlvdXRyZWcyIHVzaW5nIGB4J19rZnIsIGV4Y2VsIGFwcGVuZCBjdGl0bGUoYHknKQ0KICAgIH0NCiAgICANCiAgVmFyaWFibGVzIG9mIGludGVyZXN0Og0KICANCmBgYHtyfQ0KeXZhcjEgPC0gImtmcl9wb29sZWRfcG9vbGVkX3AxIg0KeHZhcnMxIDwtIGMoIm5jb2xsZWdlIiwgIm5mb3VyeXIiLCAibmZvdXJ5cnByaXYiLCAibnB1YiIsICJuZWxpdGUiLCAiaGFzY29sbGVnZSIsICJwb3BkZW5zaXR5MjAxMCIsICJtZWRfaGhpbmMyMDE2IikNCmN6MSA8LSBjelssIGMoeXZhcjEsIHh2YXJzMSldDQoNCmxtLm1vZGVsMSA8LSBhcy5mb3JtdWxhKHBhc3RlMCh5dmFyMSwgIiB+ICIsIHBhc3RlMCh4dmFyczEsIGNvbGxhcHNlID0gICIgKyAiKSkpDQoNCmBgYA0KDQp0ZXN0aW5nPw0KYGBge3J9DQpsbS5rZnJfcDEgPC0gbG0obG0ubW9kZWwxLA0KICAgICAgICAgICAgICAgIGRhdGEgPSBjeikNCnN1bW1hcnkobG0ua2ZyX3AxKQ0KDQpzdGFyZ2F6ZXIoY3oxLCB0eXBlID0gInRleHQiLCB0aXRsZT0iRGVzY3JpcHRpdmUgc3RhdGlzdGljcyIsIGRpZ2l0cz0xLCBvdXQ9InRhYmxlMS50eHQiKQ0KDQpzdGFyZ2F6ZXIobG0ua2ZyX3AxLA0KICAgICAgICAgIHR5cGUgPSAidGV4dCIsDQogICAgICAgICAgZGVwLnZhci5sYWJlbHMgPSBjKCJrZnJfcG9vbGVkX3Bvb2xlZF9wMSIpKQ0KICMgICAgICAgICAgLA0KICMgICAgICAgICAgY292YXJpYXRlLmxhYmVscyA9IGMoIkdyb3NzIGhvcnNlcG93ZXIiLCAiUmVhciBheGxlIHJhdGlvIiwiRm91ciBmb3dhcmQgZ2VhcnMiLA0KICMgIkZpdmUgZm9yd2FyZCBnZWFycyIsIlR5cGUgb2YgdHJhbnNtaXNzaW9uIChtYW51YWw9MSkiKSwgb3V0PSJtb2RlbHMudHh0IikNCg0KDQpgYGANCg0KbmVsaXRlIG9uIGtmciBhdCBkaWZmZXJlbnQgbGV2ZWxzDQpgYGB7cn0NCnl2YXIucDEgPC0gImtmcl9wb29sZWRfcG9vbGVkX3AxIg0KeXZhci5wMjUgPC0gImtmcl9wb29sZWRfcG9vbGVkX3AyNSINCnl2YXIucDUwIDwtICJrZnJfcG9vbGVkX3Bvb2xlZF9wNTAiDQp5dmFyLnA3NSA8LSAia2ZyX3Bvb2xlZF9wb29sZWRfcDc1Ig0KeXZhci5wMTAwIDwtICJrZnJfcG9vbGVkX3Bvb2xlZF9wMTAwIg0KeHZhcnMubmVsaXRlIDwtIGMoIm5lbGl0ZSIsICJwb3BkZW5zaXR5MjAxMCIsICJtZWRfaGhpbmMyMDE2IikNCmxtLm5lbGl0ZS5wMSA8LSBhcy5mb3JtdWxhKHBhc3RlMCh5dmFyLnAxLCAiIH4gIiwgcGFzdGUwKHh2YXJzLm5lbGl0ZSwgY29sbGFwc2UgPSAgIiArICIpKSkNCmxtLm5lbGl0ZS5wMjUgPC0gYXMuZm9ybXVsYShwYXN0ZTAoeXZhci5wMjUsICIgfiAiLCBwYXN0ZTAoeHZhcnMubmVsaXRlLCBjb2xsYXBzZSA9ICAiICsgIikpKQ0KbG0ubmVsaXRlLnA1MCA8LSBhcy5mb3JtdWxhKHBhc3RlMCh5dmFyLnA1MCwgIiB+ICIsIHBhc3RlMCh4dmFycy5uZWxpdGUsIGNvbGxhcHNlID0gICIgKyAiKSkpDQpsbS5uZWxpdGUucDc1IDwtIGFzLmZvcm11bGEocGFzdGUwKHl2YXIucDc1LCAiIH4gIiwgcGFzdGUwKHh2YXJzLm5lbGl0ZSwgY29sbGFwc2UgPSAgIiArICIpKSkNCmxtLm5lbGl0ZS5wMTAwIDwtIGFzLmZvcm11bGEocGFzdGUwKHl2YXIucDEwMCwgIiB+ICIsIHBhc3RlMCh4dmFycy5uZWxpdGUsIGNvbGxhcHNlID0gICIgKyAiKSkpDQpuZWxpdGUucDEgPC0gbG0obG0ubmVsaXRlLnAxLCBjeikNCm5lbGl0ZS5wMjUgPC0gbG0obG0ubmVsaXRlLnAyNSwgY3opDQpuZWxpdGUucDUwIDwtIGxtKGxtLm5lbGl0ZS5wNTAsIGN6KQ0KbmVsaXRlLnA3NSA8LSBsbShsbS5uZWxpdGUucDc1LCBjeikNCm5lbGl0ZS5wMTAwIDwtIGxtKGxtLm5lbGl0ZS5wMTAwLCBjeikNCnR4dHRhYmxlLm5lbGl0ZSA8LSBzdGFyZ2F6ZXIobmVsaXRlLnAxLCBuZWxpdGUucDI1LCBuZWxpdGUucDUwLCBuZWxpdGUucDc1LCBuZWxpdGUucDEwMCwNCiAgICAgICAgICB0eXBlID0gInRleHQiLA0KICAgICAgICAgIHRpdGxlID0gIlRoZSBFZmZlY3Qgb2YgRWxpdGUgQ29sbGVnZXMgaW4gQ29tbXV0aW5nIFpvbmUgb24gdGhlIFByb2JhYmlsaXR5IHRoYXQgYSBDaGlsZCBmcm9tIHRoZSAyMHRoIFBlcmNlbnRpbGUgRmFsbHMgaW4gRWFjaCBJbmNvbWUgUGVyY2VudGlsZSBhcyBhbiBBZHVsdCIsDQogICAgICAgICAgZGVwLnZhci5jYXB0aW9uID0gIlBhcmVudCBJbmNvbWUgUGVyY2VudGlsZSIsDQogICAgICAgICAgZGVwLnZhci5sYWJlbHMgPSBjKCJCb3R0b20gMSUiLCAiMjUlIiwgIjUwJSIsICI3NSUiLCAiVG9wIDElIiksDQogICAgICAgICAgIyBub3RlcyA9ICJXaGVyZSBuZWxpdGUgaXMgdGhlIG51bWJlciBvZiBlbGl0ZSBjb2xsZWdlcyBpbiBjb21tdXRpbmcgem9uZSAoY3opLCBwb3BkZW5zaXR5MjAxMCBpcyB0aGUgY3oncyBwb3B1bHRpb24gZGVuc2l0eSwgYW5kIG1lZF9oaGluYzIwMTYgaXMgdGhlIG1lZGlhbiBob3VzZWhvbGQgaW5jb21lIGluIGN6IGluIDIwMTYuIiwNCiAgICAgICAgICAjIG5vdGVzLmFwcGVuZCA9IFRSVUUsDQogICAgICAgICAgIyBub3Rlcy5hbGlnbiA9ICJsIiwNCiAgICAgICAgICBvdXQgPSAibmVsaXRldGFibGUudHh0IikNCmh0bXRhYmxlLm5lbGl0ZSA8LSBzdGFyZ2F6ZXIobmVsaXRlLnAxLCBuZWxpdGUucDI1LCBuZWxpdGUucDUwLCBuZWxpdGUucDc1LCBuZWxpdGUucDEwMCwNCiAgICAgICAgICB0eXBlID0gImh0bWwiLA0KICAgICAgICAgIGRlcC52YXIubGFiZWxzID0gYygiQm90dG9tIDElIiwgIjI1JSIsICI1MCUiLCAiNzUlIiwgIlRvcCAxJSIpLA0KICAgICAgICAgIG91dCA9ICJuZWxpdGV0YWJsZS5odG1sIikNCnN1bW1hcnkobG0ubmVsaXRlLnAxKQ0KYGBgDQppbWFnZSBwcmludCBjaGVlZWVjazoNCmBgYHtyfQ0KdGFibGVzIDwtIGRhdGEuZnJhbWUodGFibGVuYW1lID0gYygiaGFzY29sbGVnZV9ibGFjayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYXNjb2xsZWdlX2tmciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYXNjb2xsZWdlX3RvcDIwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhc2NvbGxlZ2Vfd2hpdGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmNvbGxlZ2VfYmxhY2siLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmNvbGxlZ2Vfa2ZyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5jb2xsZWdlX3RvcDIwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5jb2xsZWdlX3doaXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5lbGl0ZV9ibGFjayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWxpdGVfa2ZyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5lbGl0ZV90b3AyMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWxpdGVfd2hpdGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmZvdXJ5cl9ibGFjayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZm91cnlyX2tmciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZm91cnlyX3RvcDIwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5mb3VyeXJfd2hpdGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmZvdXJ5cnByaXZfYmxhY2siLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmZvdXJ5cnByaXZfa2ZyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5mb3VyeXJwcml2X3RvcDIwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5mb3VyeXJwcml2X3doaXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5wdWJfYmxhY2siLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnB1Yl9rZnIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnB1Yl90b3AyMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJucHViX3doaXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1bXN0YXRzIiksDQogICAgICAgICAgICAgICAgICAgICBwaWN0dXJlID0gYygiQzpcXFxcVXNlcnNcXG5lcmlzXFxPbmVEcml2ZSAtIE1pZGRsZWJ1cnkgQ29sbGVnZVxcTGFzdCBTZW1lc3RlclxcRUNPTiBJbmVxdWFsaXR5ICYgSnVzdGljZVxcZWNvbjA0MDFcXGhhc2NvbGxlZ2VfYmxhY2sucG5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDOlxcVXNlcnNcXG5lcmlzXFxPbmVEcml2ZSAtIE1pZGRsZWJ1cnkgQ29sbGVnZVxcTGFzdCBTZW1lc3RlclxcRUNPTiBJbmVxdWFsaXR5ICYgSnVzdGljZVxcZWNvbjA0MDFcXGhhc2NvbGxlZ2Vfa2ZyLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzpcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxoYXNjb2xsZWdlX3RvcDIwLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzpcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxoYXNjb2xsZWdlX3doaXRlLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzpcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxuY29sbGVnZV9ibGFjay5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcbmNvbGxlZ2Vfa2ZyLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzpcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxuY29sbGVnZV90b3AyMC5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcbmNvbGxlZ2Vfd2hpdGUucG5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDOlxcVXNlcnNcXG5lcmlzXFxPbmVEcml2ZSAtIE1pZGRsZWJ1cnkgQ29sbGVnZVxcTGFzdCBTZW1lc3RlclxcRUNPTiBJbmVxdWFsaXR5ICYgSnVzdGljZVxcZWNvbjA0MDFcXG5lbGl0ZV9ibGFjay5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcbmVsaXRlX2tmci5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcbmVsaXRlX3RvcDIwLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzpcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxuZWxpdGVfd2hpdGUucG5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDOlxcVXNlcnNcXG5lcmlzXFxPbmVEcml2ZSAtIE1pZGRsZWJ1cnkgQ29sbGVnZVxcTGFzdCBTZW1lc3RlclxcRUNPTiBJbmVxdWFsaXR5ICYgSnVzdGljZVxcZWNvbjA0MDFcXG5mb3VyeXJfYmxhY2sucG5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDOlxcVXNlcnNcXG5lcmlzXFxPbmVEcml2ZSAtIE1pZGRsZWJ1cnkgQ29sbGVnZVxcTGFzdCBTZW1lc3RlclxcRUNPTiBJbmVxdWFsaXR5ICYgSnVzdGljZVxcZWNvbjA0MDFcXG5mb3VyeXJfa2ZyLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzpcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxuZm91cnlyX3RvcDIwLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzpcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxuZm91cnlyX3doaXRlLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzpcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxuZm91cnlycHJpdl9ibGFjay5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcbmZvdXJ5cnByaXZfa2ZyLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzpcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxuZm91cnlycHJpdl90b3AyMC5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcbmZvdXJ5cnByaXZfd2hpdGUucG5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDOlxcVXNlcnNcXG5lcmlzXFxPbmVEcml2ZSAtIE1pZGRsZWJ1cnkgQ29sbGVnZVxcTGFzdCBTZW1lc3RlclxcRUNPTiBJbmVxdWFsaXR5ICYgSnVzdGljZVxcZWNvbjA0MDFcXG5wdWJfYmxhY2sucG5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDOlxcVXNlcnNcXG5lcmlzXFxPbmVEcml2ZSAtIE1pZGRsZWJ1cnkgQ29sbGVnZVxcTGFzdCBTZW1lc3RlclxcRUNPTiBJbmVxdWFsaXR5ICYgSnVzdGljZVxcZWNvbjA0MDFcXG5wdWJfa2ZyLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzpcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxucHViX3RvcDIwLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzpcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxucHViX3doaXRlLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzpcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxzdW1zdGF0cy5wbmciKSkNCnRhYmxlcyR0YWJsZW5hbWUgPC0gYXMuY2hhcmFjdGVyKHRhYmxlcyR0YWJsZW5hbWUpDQp0YWJsZXMkcGljdHVyZSA8LSBhcy5jaGFyYWN0ZXIodGFibGVzJHBpY3R1cmUpDQoNCiMgd3JpdGVfY3N2KHRhYmxlcywgIm91dHB1dHRhYmxlcy5jc3YiKQ0KDQojIHRhYmxlcyAlPiUNCiMgICBnZ3Bsb3QoKSArDQojICAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiMgICBnZW9tX2ltYWdlKGFlcyhpbWFnZSA9IHBpY3R1cmUpLA0KIyAgICAgICAgICAgICAgc2l6ZSA9IC4yKQ0KYGBgDQoNCg0KUGxvdHRpbmcgdGhlIGxtczoNCg0KYGBge3J9DQpsbTEgPC0gbG0oa2ZyX3Bvb2xlZF9wb29sZWRfbWVhbiB+IG5jb2xsZWdlICsgcG9wZGVuc2l0eTIwMTAgKyBtZWRfaGhpbmMyMDE2LA0KICAgZGF0YSA9IGN6KQ0KbmNvbGxlZ2Uuc2VxIDwtIHNlcShmcm9tID0gMCwgdG8gPSA4MiwgYnkgPSA1KQ0Ka2ZyX3Bvb2xlZF9wb29sZWRfbWVhbi5zZXEgPC0gc2VxKGZyb20gPSAwLjI0OTA4NTcsIHRvID0gMC42NzI4MDkwLCBieSA9IC4wMjUpDQpwb3BkZW5zaXR5MjAxMC5zZXEgPC0gc2VxKGZyb20gPSAwLjEwNiwgdG8gPSA1NjM1LjgwNCwgYnkgPSAzMDApDQptZWRfaGhpbmMyMDE2LnNlcSA8LSBzZXEoZnJvbSA9IDI2NjQ1LCB0byA9IDEwMzA0MywgYnkgPSAzNzUwKQ0KZ3JpZDEgPC0gZXhwYW5kLmdyaWQoJ25jb2xsZWdlJyA9IG5jb2xsZWdlLnNlcSwNCiAgICAgICAgICAgICAgICAgICAgICdrZnJfcG9vbGVkX3Bvb2xlZF9tZWFuJyA9IGtmcl9wb29sZWRfcG9vbGVkX21lYW4uc2VxLA0KICAgICAgICAgICAgICAgICAgICAgJ3BvcGRlbnNpdHkyMDEwJyAgPSBwb3BkZW5zaXR5MjAxMC5zZXEsDQogICAgICAgICAgICAgICAgICAgICAnbWVkX2hoaW5jMjAxNicgPSBtZWRfaGhpbmMyMDE2LnNlcSkNCnByZWRpY3Rpb25zIDwtIHByZWRpY3QubG0obG0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBncmlkMSkNCmZpbmFsLmRhdGEgPC0gZGF0YS5mcmFtZShncmlkMSwgcHJlZGljdGlvbnMpDQoNCmZpbmFsLmRhdGEgJT4lDQogIGdncGxvdChhZXMoeCA9IG5jb2xsZWdlLA0KICAgICAgICAgICAgIHkgPSBwcmVkaWN0aW9ucykpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBzdGF0X3Ntb290aChhZXMoeCA9IG5jb2xsZWdlLCB5ID0gcHJlZGljdGlvbnMpLCBtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICBmb3JtdWxhID0geSB+IGtmcl9wb29sZWRfcG9vbGVkX21lYW4gfiBuY29sbGVnZSArIHBvcGRlbnNpdHkyMDEwICsgbWVkX2hoaW5jMjAxNiwgc2UgPSBGQUxTRSkgKw0KICB0aGVtZV9lY29ub21pc3QoKSArDQogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIllsT3JSZCIpDQoNCmdncGxvdChhZXMoeCA9IHBsb3R4LCB5ID0gcGxvdHkpKSAlPiUNCiAgZ2VvbV9hYmxpbmUoKQ0KDQpsbTIgPC0gbG0oa2ZyX2JsYWNrX3Bvb2xlZF9wNTAgfiBuY29sbGVnZSArIHBvcGRlbnNpdHkyMDEwICsgbWVkX2hoaW5jMjAxNiwNCiAgIGRhdGEgPSBjeikNCmxtMyA8LSBsbShrZnJfd2hpdGVfcG9vbGVkX3A1MCB+IG5jb2xsZWdlICsgcG9wZGVuc2l0eTIwMTAgKyBtZWRfaGhpbmMyMDE2LA0KICAgZGF0YSA9IGN6KQ0KDQpjeiAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gbmNvbGxlZ2UsIHkgPSBrZnJfcG9vbGVkX3Bvb2xlZF9tZWFuKSkgKw0KICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAzLjc5OWUtMDEsIHNsb3BlID0gLTguNTcyZS0wNCkgKw0KICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAzLjUyM2UtMDEsIHNsb3BlID0gLTkuNTczZS0wNCkgKw0KICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSA0Ljk3M2UtMDEsIHNsb3BlID0gLTkuMTMzZS0wNCkgKw0KICB5bGltKDMuNWUtMDEsIDAuNSkNCg0KcGxvdChsbTEpDQoNCmBgYA0KDQoNCg0KV2FpdCBsZW1tZSB0cnkgdGhlIGxvbmcgZm9ybWF0IHRoaW5nOg0KDQpgYGB7cn0NCmtmci5jb2xzIDwtIGMoImtmcl9ibGFja19wb29sZWRfcDEiLCAia2ZyX2JsYWNrX3Bvb2xlZF9wMjUiLCAia2ZyX2JsYWNrX3Bvb2xlZF9wNTAiLCAia2ZyX2JsYWNrX3Bvb2xlZF9wNzUiLCAia2ZyX2JsYWNrX3Bvb2xlZF9wMTAwIiwgImtmcl9wb29sZWRfcG9vbGVkX3AxIiwgImtmcl9wb29sZWRfcG9vbGVkX3AyNSIsICJrZnJfcG9vbGVkX3Bvb2xlZF9wNTAiLCAia2ZyX3Bvb2xlZF9wb29sZWRfcDc1IiwgImtmcl9wb29sZWRfcG9vbGVkX3AxMDAiLCAia2ZyX3doaXRlX3Bvb2xlZF9wMSIsICJrZnJfd2hpdGVfcG9vbGVkX3AyNSIsICJrZnJfd2hpdGVfcG9vbGVkX3A1MCIsICJrZnJfd2hpdGVfcG9vbGVkX3A3NSIsICJrZnJfd2hpdGVfcG9vbGVkX3AxMDAiKQ0KDQprZnIudGVzdCA8LSBjelssIGMoa2ZyLmNvbHMsICJuY29sbGVnZSIsICJuZm91cnlyIiwgIm5lbGl0ZSIsICJucHViIiwgInBvcGRlbnNpdHkyMDEwIiwgIm1lZF9oaGluYzIwMTYiKV0NCg0Ka2V5Y29sMSA8LSAiY2F0ZWdvcnkiDQp2YWx1ZWNvbDEgPC0gImtmciINCmdhdGhlcmNvbHMxIDwtIGtmci5jb2xzDQoNCmRhdGFfbG9uZyA8LSBnYXRoZXJfKGtmci50ZXN0LCBrZXljb2wxLCB2YWx1ZWNvbDEsIGdhdGhlcmNvbHMxKQ0KDQpkYXRhX2xvbmdhIDwtIGRhdGFfbG9uZyAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoZGF0YV9sb25nJGNhdGVnb3J5LCAiYmxhY2siLCBuZWdhdGUgPSBGQUxTRSkpICU+JQ0KICBtdXRhdGUocmFjZSA9ICJibGFjayIpDQoNCmRhdGFfbG9uZ2EkY2F0ZWdvcnkgPC0gZGF0YV9sb25nYSRjYXRlZ29yeSAlPiUNCiAgc3RyX3JlcGxhY2VfYWxsKCJrZnJfYmxhY2tfcG9vbGVkX3AxIiwgIjEiKSAlPiUNCiAgc3RyX3JlcGxhY2VfYWxsKCJrZnJfYmxhY2tfcG9vbGVkX3AyNSIsICIyNSIpICU+JQ0KICBzdHJfcmVwbGFjZV9hbGwoImtmcl9ibGFja19wb29sZWRfcDUwIiwgIjUwIikgJT4lDQogIHN0cl9yZXBsYWNlX2FsbCgia2ZyX2JsYWNrX3Bvb2xlZF9wNzUiLCAiNzUiKSAlPiUNCiAgc3RyX3JlcGxhY2VfYWxsKCJrZnJfYmxhY2tfcG9vbGVkX3AxMDAiLCAiMTAwIikNCg0KZGF0YV9sb25nYiA8LSBkYXRhX2xvbmcgJT4lDQogIGZpbHRlcihzdHJfZGV0ZWN0KGRhdGFfbG9uZyRjYXRlZ29yeSwgIndoaXRlIiwgbmVnYXRlID0gRkFMU0UpKSAlPiUNCiAgbXV0YXRlKHJhY2UgPSAid2hpdGUiKQ0KDQpkYXRhX2xvbmdiJGNhdGVnb3J5IDwtIGRhdGFfbG9uZ2IkY2F0ZWdvcnkgJT4lDQogIHN0cl9yZXBsYWNlX2FsbCgia2ZyX3doaXRlX3Bvb2xlZF9wMSIsICIxIikgJT4lDQogIHN0cl9yZXBsYWNlX2FsbCgia2ZyX3doaXRlX3Bvb2xlZF9wMjUiLCAiMjUiKSAlPiUNCiAgc3RyX3JlcGxhY2VfYWxsKCJrZnJfd2hpdGVfcG9vbGVkX3A1MCIsICI1MCIpICU+JQ0KICBzdHJfcmVwbGFjZV9hbGwoImtmcl93aGl0ZV9wb29sZWRfcDc1IiwgIjc1IikgJT4lDQogIHN0cl9yZXBsYWNlX2FsbCgia2ZyX3doaXRlX3Bvb2xlZF9wMTAwIiwgIjEwMCIpDQoNCmRhdGFfbG9uZ2MgPC0gZGF0YV9sb25nICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChkYXRhX2xvbmckY2F0ZWdvcnksICJwb29sZWRfcG9vbGVkIiwgbmVnYXRlID0gRkFMU0UpKSAlPiUNCiAgbXV0YXRlKHJhY2UgPSAicG9vbGVkIikNCg0KZGF0YV9sb25nYyRjYXRlZ29yeSA8LSBkYXRhX2xvbmdjJGNhdGVnb3J5ICU+JQ0KICBzdHJfcmVwbGFjZV9hbGwoImtmcl9wb29sZWRfcG9vbGVkX3AxIiwgIjEiKSAlPiUNCiAgc3RyX3JlcGxhY2VfYWxsKCJrZnJfcG9vbGVkX3Bvb2xlZF9wMjUiLCAiMjUiKSAlPiUNCiAgc3RyX3JlcGxhY2VfYWxsKCJrZnJfcG9vbGVkX3Bvb2xlZF9wNTAiLCAiNTAiKSAlPiUNCiAgc3RyX3JlcGxhY2VfYWxsKCJrZnJfcG9vbGVkX3Bvb2xlZF9wNzUiLCAiNzUiKSAlPiUNCiAgc3RyX3JlcGxhY2VfYWxsKCJrZnJfcG9vbGVkX3Bvb2xlZF9wMTAwIiwgIjEwMCIpDQoNCmxvbmcuZGF0YTEgPC0gcmJpbmQoZGF0YV9sb25nYSwgZGF0YV9sb25nYiwNCiAgICAgICAgICAgICAgICAgICAgZGF0YV9sb25nYykgDQoNCmxvbmcuZGF0YTFhIDwtIGxvbmcuZGF0YTEgJT4lDQogIG11dGF0ZShibGFjayA9IGlmZWxzZShyYWNlID09ICJibGFjayIsDQogICAgICAgICAgICAgICAgICAgICAgICBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpLA0KICAgICAgICAgd2hpdGUgPSBpZmVsc2UocmFjZSA9PSAid2hpdGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKSkNCg0KbG9uZy5sbTEgPC0gbG0oa2ZyIH4gbmNvbGxlZ2UgKyBibGFjayArIHdoaXRlICsgcG9wZGVuc2l0eTIwMTAgKyBtZWRfaGhpbmMyMDE2LA0KICAgZGF0YSA9IGxvbmcuZGF0YTFhKQ0Kc3VtbWFyeShsb25nLmxtMSkNCg0KIyB3cml0ZV9jc3YobG9uZy5kYXRhMWEsICJsb25nX2tmci5jc3YiKQ0KIyBsb25nLmRhdGExYSA8LSByZWFkX2NzdignbG9uZ19rZnIuY3N2JykNCg0KYGBgDQoNCk91dHB1dCB0YWJsZToNCmBgYHtyfQ0Kc3RhcmdhemVyKGxvbmcubG0xLA0KICAgICAgICAgIHR5cGUgPSAidGV4dCIpDQpgYGANCg0KVHJ5IHdpdGggaW50ZXJhY3Rpb24gJiB3L28gaGhpbmM6DQpgYGB7cn0NCmxvbmcubG0xLndvaGhpbmMgPC0gbG0oa2ZyIH4gbmNvbGxlZ2UgKyBibGFjayArIHdoaXRlICsgcG9wZGVuc2l0eTIwMTAsDQogICBkYXRhID0gbG9uZy5kYXRhMWEpDQpsb25nLmxtMWEgPC0gbG0oa2ZyIH4gbmNvbGxlZ2UgKyBibGFjayArIHdoaXRlICsgYmxhY2sqbmNvbGxlZ2UgKyB3aGl0ZSpuY29sbGVnZSArIHBvcGRlbnNpdHkyMDEwICsgbWVkX2hoaW5jMjAxNiwNCiAgIGRhdGEgPSBsb25nLmRhdGExYSkNCnN1bW1hcnkobG9uZy5sbTFhKQ0KYGBgDQpObyBzaWduaWZpY2FudCBkaWZmZXJlbmNlLiBXaWxsIHN0aWNrIHRvIG9yaWdpbmFsIG1vZGVsLg0KDQpWaXN1YWxpemUgaXQgbWF5YmU/Og0KYGBge3J9DQpsb25nLmxtMS5yYWNlIDwtIGxtKGtmciB+IG5jb2xsZWdlICsgcmFjZSArIHBvcGRlbnNpdHkyMDEwICsgbWVkX2hoaW5jMjAxNiwNCiAgIGRhdGEgPSBsb25nLmRhdGExYSkNCg0KbmNvbGxlZ2Uuc2VxIDwtIHNlcShmcm9tID0gMCwgdG8gPSA4MiwgYnkgPSAxKQ0KcmFjZS5zZXEgPC0gdW5pcXVlKGxvbmcuZGF0YTFhJHJhY2UpDQpwb3BkZW5zaXR5MjAxMC5zZXEgPC0gc2VxKGZyb20gPSAwLjEwNiwgdG8gPSA1NjM1LjgwNCwgYnkgPSAzMDApDQptZWRfaGhpbmMyMDE2LnNlcSA8LSBzZXEoZnJvbSA9IDI2NjQ1LCB0byA9IDEwMzA0MywgYnkgPSAzNzUwKQ0KZ3JpZDEgPC0gZXhwYW5kLmdyaWQoJ25jb2xsZWdlJyA9IG5jb2xsZWdlLnNlcSwNCiAgICAgICAgICAgICAgICAgICAgICdyYWNlJyA9IHJhY2Uuc2VxLA0KICAgICAgICAgICAgICAgICAgICAgJ3BvcGRlbnNpdHkyMDEwJyAgPSBwb3BkZW5zaXR5MjAxMC5zZXEsDQogICAgICAgICAgICAgICAgICAgICAnbWVkX2hoaW5jMjAxNicgPSBtZWRfaGhpbmMyMDE2LnNlcSkNCnByZWRpY3Rpb25zIDwtIHByZWRpY3QubG0obG9uZy5sbTEucmFjZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZDEpDQpmaW5hbC5kYXRhIDwtIGRhdGEuZnJhbWUoZ3JpZDEsIHByZWRpY3Rpb25zKQ0KDQoNCmZpbmFsLmRhdGEgJT4lDQogIGdyb3VwX2J5KHJhY2UsIG5jb2xsZWdlKSAlPiUgDQogIHN1bW1hcmlzZShtZWFucHJlZGljdCA9IG1lYW4ocHJlZGljdGlvbnMpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gbmNvbGxlZ2UsDQogICAgICAgICAgICAgeSA9IG1lYW5wcmVkaWN0KSkgKw0KICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gZmFjdG9yKHJhY2UpKSwNCiAgICAgICAgICAgIHNpemUgPSAxLjUpICsNCiAgdGhlbWVfZWNvbm9taXN0KCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSkgKw0KICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJZbE9yUmQiKSArDQogIHlsYWIoIkhvdXNlaG9sZCBJbmNvbWUgUGVyY2VudGlsZSBSYW5rIikgKw0KICBnZ3RpdGxlKCJFZmZlY3Qgb2YgTnVtYmVyIG9mIENvbGxlZ2VzIGluIENaIG9uIEhvdXNlaG9sZCBJbmNvbWUgUGVyY2VudGlsZSBSYW5rIGJ5IFJhY2UiKSArIA0KICBsYWJzKGNvbG9yID0gIiIpDQoNCg0KYGBgDQoNCg0KQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkN0cmwrQWx0K0kqLg0KDQpXaGVuIHlvdSBzYXZlIHRoZSBub3RlYm9vaywgYW4gSFRNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGUgYW5kIG91dHB1dCB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSBpdCAoY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gb3IgcHJlc3MgKkN0cmwrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4NCg0KVGhlIHByZXZpZXcgc2hvd3MgeW91IGEgcmVuZGVyZWQgSFRNTCBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yLiBDb25zZXF1ZW50bHksIHVubGlrZSAqS25pdCosICpQcmV2aWV3KiBkb2VzIG5vdCBydW4gYW55IFIgY29kZSBjaHVua3MuIEluc3RlYWQsIHRoZSBvdXRwdXQgb2YgdGhlIGNodW5rIHdoZW4gaXQgd2FzIGxhc3QgcnVuIGluIHRoZSBlZGl0b3IgaXMgZGlzcGxheWVkLg0K